package com.bookrecomm.service;

import com.bookrecomm.entity.Book;
import com.bookrecomm.vo.BookVO;
import com.bookrecomm.vo.PageVO;
import org.springframework.data.domain.Pageable;

import java.util.List;

/**
 * 图书服务接口
 * 定义图书相关的业务逻辑方法
 */
public interface BookService {

    /**
     * 根据ID查询图书
     * @param id 图书ID
     * @return 图书信息
     */
    BookVO findById(Long id);

    /**
     * 分页查询图书列表
     * @param pageable 分页参数
     * @return 分页图书列表
     */
    PageVO<BookVO> findAll(Pageable pageable);

    /**
     * 根据分类ID查询图书列表
     * @param categoryId 分类ID
     * @param pageable 分页参数
     * @return 分页图书列表
     */
    PageVO<BookVO> findByCategoryId(Long categoryId, Pageable pageable);

    /**
     * 根据标签ID查询图书列表
     * @param tagId 标签ID
     * @param pageable 分页参数
     * @return 分页图书列表
     */
    PageVO<BookVO> findByTagId(Long tagId, Pageable pageable);

    /**
     * 搜索图书
     * @param keyword 关键词
     * @param pageable 分页参数
     * @return 分页图书列表
     */
    PageVO<BookVO> search(String keyword, Pageable pageable);

    /**
     * 获取推荐图书列表
     * @param userId 用户ID，可为null表示未登录用户
     * @param limit 限制数量
     * @return 推荐图书列表
     */
    List<BookVO> getRecommendations(Long userId, int limit);

    /**
     * 获取热门图书列表
     * @param limit 限制数量
     * @return 热门图书列表
     */
    List<BookVO> getHotBooks(int limit);

    /**
     * 获取新书列表
     * @param limit 限制数量
     * @return 新书列表
     */
    List<BookVO> getNewBooks(int limit);

    /**
     * 添加图书
     * @param book 图书信息
     * @return 添加后的图书信息
     */
    BookVO addBook(Book book);

    /**
     * 更新图书信息
     * @param id 图书ID
     * @param book 图书信息
     * @return 更新后的图书信息
     */
    BookVO updateBook(Long id, Book book);

    /**
     * 删除图书
     * @param id 图书ID
     * @return 是否删除成功
     */
    boolean deleteBook(Long id);

    /**
     * 更新图书状态
     * @param id 图书ID
     * @param status 状态：0-下架，1-上架
     * @return 是否更新成功
     */
    boolean updateStatus(Long id, Integer status);
    
    /**
     * 将图书实体转换为VO对象，并根据用户ID设置是否收藏和阅读进度
     * @param book 图书实体
     * @param userId 用户ID
     * @return 图书VO对象
     */
    BookVO convertToBookVO(Book book, Long userId);
}
